package com.zjj.learn.designmodel.work.facade;

public class FacadeTest {

    public static void main(String[] args) {
        XiaoaiTongxue xiaoai = new XiaoaiTongxue();
        xiaoai.sleep();
    }


    /**
     * 外观模式
     * 外观模式是一种结构型模式
     * 外观模式又叫做门面模式，是为了给一个复杂的子系统提供一个更加容易被访问的统一接口。
     * 在该模式下有个对外的统一接口，使用者不需要了解接口内部的详细情况，只需要调用统一接口来实现自己的目的即可。
     * 举例：现在智能语音家居使用广泛，我们可以使用智能家居帮我们开窗帘、开空调、开灯等等。当到了晚上时，我们就像睡觉了，这个时候我们告诉
     *      智能家居说：“我要睡觉了”，这时智能家居就会做很多事情，帮我们关闭窗帘、关闭电视机、将空调温度调到刚刚好等等一系列最有助于睡眠的状态。
     *      我们实际上是不需要知道具体要做什么，只需要告诉它我要睡觉了，它就自动帮我们做完了。这就是外观模式的体现。
     * 这样子能够大大的降低程序的复杂程度，提高了程序的可维护性。
     * 外观模式是迪米特法则的典型应用
     *
     * 外观模式主要有两种角色：
     *    1、外观角色：为多个子系统提供一个统一的接口。比如只能家具。
     *    2、子系统角色：实现系统的部分功能，可以供外观角色调用。比如电视机、灯等等。
     *
     * 具体案例：见 {@link com.zjj.learn.designmodel.work.facade}
     * 其中，外观角色：
     *      {@link com.zjj.learn.designmodel.work.facade.XiaoaiTongxue}
     *      子系统角色：
     *      {@link com.zjj.learn.designmodel.work.facade.Light}
     *      {@link com.zjj.learn.designmodel.work.facade.TV}
     *      {@link com.zjj.learn.designmodel.work.facade.AirCondition}
     *
     *
     * 好处：
     *      1、降低了子系统与客户端之间的耦合度，使得子系统的变化不会影响调用它的客户类。
     *      2、对客户屏蔽了子系统组件，减少了客户处理的对象数目，并使得子系统使用起来更加容易。
     *
     * 坏处：不符合开闭原则，修改很麻烦
     **/
}
